//
//  JSSUserAccountModel.swift
//  WeiBoItem
//
//  Created by jss on 16/4/19.
//  Copyright © 2016年 jss. All rights reserved.
//

import UIKit



class JSSUserAccountModel: NSObject {

    //单例
    static let sharedAccontModel = JSSUserAccountModel()
    
    override init() {
        super.init()
        //代表当前ViewModel初始化的时候  就去沙盒中读取数据
        account = self.accountInSandex()
    }
    
    //当前登录的用户的账户信息
    var account:JSSUserAccont?
    
    var isLogin:Bool {
        
        //1.是否有accessToken
        guard let _ = self.account?.access_token else {
            
            return false
        }

        //判断accessToken是否过期
        // 如果判断 accessToken 是否过期 --> 取到过期时间，与当前时间进行对比，如果过期时间比当前时间小，就代表过期
        //1-取到过期时间 (先进行判断是否有 self.account?.expiresDate)
        guard let expiresDate = self.account?.expiresDate else {
            
            return false
        }
    
        //2-与当前时间进行对比 ->当前时间比过期时间小 返回 true
        
        if NSDate().compare(expiresDate) == .OrderedAscending {
            
            //没有过期 就返回true
            return true
        }
        
        return false
    }
    
    
    //加载AccessToken
    func loadAccessToken(code:String, finished:(isSuccess:Bool)->()) {
        
        let urlStr = "https://api.weibo.com/oauth2/access_token"
        /* 从文档中复制出来的
        必选	类型及范围	说明
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。*/
        
        let parametes = [
            "client_id":WB_APPKEY,
            "client_secret":WB_APP_SECRET,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":WB_REDIREC
        ]
        //发请求(请求上面参数对应的值responseObject) 根据后台API 获取数据
        HMNetworkTools.sharedTools.request(.Post, urlString: urlStr, parameters: parametes) { (responseObject, error) -> () in
            if error != nil {
                
                print(error)
                finished(isSuccess: false)
                return
            }
            
            //print("请求成功\(responseObject)")
            
            // // 如果 as 是写在 if let 或者 guard 里面，都使用 as?
            guard let dict = responseObject as? [String:AnyObject] else {
                
                print("后台返回数据错误")
                finished(isSuccess: false)
                return
            }
            
            //字典转模型
            let accont = JSSUserAccont(dict: dict)
            print(accont)
            
            // accessToken获取到了 获取个人信息
            
           
            
//            self.loadUserInfo(accont)
            self.loadUserInfo(accont, finished: finished)
            
            
            
        }
        
        
    }
    
    //获取个人信息
    func loadUserInfo(accont:JSSUserAccont,finished:((isSucced:Bool)->())){
        
        let urlStr = "https://api.weibo.com/2/users/show.json"
        
        /*
        必选	类型及范围	说明
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        uid	false	int64	需要查询的用户ID。
        screen_name	false	string	需要查询的用户昵称。
        */
        //请求参数
        let parametes = [
            "access_token":accont.access_token ?? "",
            "uid":accont.uid ?? ""
        ]
        
        //发送请求
        HMNetworkTools.sharedTools.request(.Get, urlString: urlStr, parameters: parametes) { (responseObject, error) -> () in
            
            print("方法被执行了")
            print(responseObject)
            
            if error != nil {
                print(error)
                finished(isSucced: false)
                
                return
            }
            
            //判断数据是否是字典
            guard let dict = responseObject else {
                
                print("后台返回数据错误")
                 finished(isSucced: false)
                return
            }
            
            // 如果等号前面是可选值的话，就使用 as? 如果是必选值，就使用 as!(获取到个人信息)
            accont.name = dict["name"] as? String
            accont.avatar_large = dict["avatar_large"] as? String
            
            //得到新的accont信息
            print(accont)
            
            //给属性accont赋值 为了保存获取的信息(accont)
            self.account = accont
            
            //获取到个人信息 保存登录信息(归档方式保存)
            self.saveAccout(accont)
            
            //代表登录成功 这里回调闭包告诉外面控制器 登陆成功
            finished(isSucced: true)
            
            //代表登录成功 (这些逻辑都应该在控制里完成)
            //关闭当前控制器
            //切换控制器
            
            
        }
      
    }
    
    //归档(保存)用户信息
    private func saveAccout(account:JSSUserAccont){
        
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString) .stringByAppendingPathComponent("accountArchive")
        
        NSKeyedArchiver.archiveRootObject(account, toFile: path)
        
        print(path)
        
    }
    
    //去沙盒读取用户信息
    
    private func accountInSandex()->JSSUserAccont? {
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString) .stringByAppendingPathComponent("accountArchive")
        //解档返回数据
        let backDate = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? JSSUserAccont
        
        return backDate
        
    }

    
    
}
